package com.fishingwithme.infrastructure.mapper;

import com.fishingwithme.domain.fisher.FisherSpot;
import com.fishingwithme.domain.spots.Spot;
import cn.fishingwithme.infrastructure.dtos.*;
import com.fishingwithme.infrastructure.dtos.*;
import org.apache.ibatis.annotations.Mapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

/**
 * 钓点信息Mapper接口
 */
@Mapper
public interface SpotMapper {

    /**
     * 根据ID查询钓点
     */
    SpotDetailDto selectById(Long id);

    /**
     * 查询所有钓点
     */
    List<Spot> selectAll();

    /**
     * 根据城市代码查询钓点
     */
    List<Spot> selectByCityCode(String cityCode);

    List<SpotDashboardDto> selectAllByCityCode(String cityCode);

    List<SpotDashboardDto> selectAllByLocationAndDistance(@Param("latitude") Double latitude, @Param("longitude") Double longitude, Long userId, Integer distance);

    List<SpotDashboardDto> selectMySpotsByLocationAndDistance(@Param("latitude") Double latitude, @Param("longitude") Double longitude,Long userId, Integer distance);

    /**
     * 插入钓点信息
     */
    int insert(Spot spot);

    /**
     * 更新钓点信息
     */
    int update(Spot spot);

    /**
     * 根据ID删除钓点
     */
    int delete(Long id);

    /**
     * 动态条件查询钓点
     */
    List<Spot> selectByParams(Map<String, Object> params);

    int insertFisherSpot(FisherSpot fisherSpot);

    UserSpotDto selectUserLatestSpot(Long userId);

    UserSpotDto selectUserSpot(Long spotId,Long userId);

    void insertVisitHarvest(VisitHarvestDto dto);


    SpotNavDto getSpotNavLineBySpotId(Long spotId);

    void insertSpotUpdate(SpotUpdateDto record);

    int deleteSpotUpdateById(Long id);

    int deleteSpotUpdateBySpotId(Long spotId);

    void updateSpotUpdate(SpotUpdateDto record);

    SpotUpdateDto selectSpotUpdateById(Long id);

    List<SpotUpdateDto> selectSpotUpdateBySpotId(Long spotId);

    List<SpotUpdateDto> selectSpotUpdateAll();

    Integer checkSpotExists(Double latitude, Double longitude,Integer distance);

    SpotEnhanceDto selectByIdForUpdate(Long id);

    void updateSpot(FishingSpotUpdateDto dto);

    List<SpotDashboardDto> selectSecretSpotsByLocationAndDistance(@Param("latitude") Double latitude, @Param("longitude") Double longitude, Integer distance);

    Boolean hasCollectedByUser(Long spotId, Long userId);


    void updateHarvestLikeCnt(String targetType,Long targetId);

    List<SearchResponseDto> search(String query, String cityCode,Long userId);

    /**
     * 分页查询钓点列表，支持动态条件
     *
     * @param page 分页对象
     * @param isFree 是否收费
     * @param cityCode 城市代码
     * @param isPrivate 是否秘密钓点
     * @param isForbidden 是否禁止钓鱼
     * @param query 钓点名称模糊查询
     * @return 分页钓点列表
     */
    IPage<SpotListDto> selectSpotListPage(IPage<SpotListDto> page,
                                          @Param("isFree") Boolean isFree,
                                          @Param("cityCode") String cityCode,
                                          @Param("isPrivate") Boolean isPrivate,
                                          @Param("isForbidden") Boolean isForbidden,
                                          @Param("query") String query);

    /**
     * 更新钓点禁用状态
     *
     * @param spotId 钓点ID
     * @param disabled 是否禁用
     * @return 更新行数
     */
    int updateDisabledStatus(@Param("spotId") Long spotId, @Param("disabled") Boolean disabled);
}